package remote;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.List;

import Interfaz.ControllerI;
import Interfaz.EnvioDTO;
import Interfaz.ItemPlanMantenimientoDTO;
import Interfaz.RutaDTO;
import Interfaz.SucursalDTO;
import Interfaz.VehiculoDTO;
import Negocio.Cliente;
import Negocio.ClienteDTO;
import Negocio.CuentaCorriente;
import Negocio.Deposito;
import Negocio.ItemCuentaCorriente;
import Negocio.Sucursal;
import Negocio.Vehiculo;
import Negocio.Viaje;
import Servicios.ServiceException;

public class BusinessDelegate {
	private static BusinessDelegate instance = null;
	private ControllerI controller;
	
	private BusinessDelegate() {
		getRemoteInstance();
	}
	
	public static BusinessDelegate getInstance() {
		if (instance == null) {
			instance = new BusinessDelegate();
		}
		return instance;
	}
	
	private void getRemoteInstance() {
		try {
			controller = (ControllerI) Naming.lookup("//localhost/Controller");
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (NotBoundException e) {
			e.printStackTrace();
		}
		
	}
	
	public boolean existeCliente(String cliente) throws RemoteException {
		return controller.existeCliente(cliente);
	}
	
	public Cliente buscarCliente(String cliente) throws RemoteException, Exception {
		return controller.buscarCliente(cliente);
	}
	
	public List<Cliente> getAllClientes() throws RemoteException {
		return controller.getAllClientes();
	}
	
	public void altaClienteParticular (ClienteDTO clienteDTO) throws RemoteException {
		
		controller.altaClienteParticular (clienteDTO);
	}
	
	public void altaEmpresaRegular(ClienteDTO clienteDTO, Float limiteDeCredito) throws RemoteException, ServiceException {
		controller.altaEmpresaRegular(clienteDTO, limiteDeCredito);
	}
	
	public List<SucursalDTO> getAllSucursales() throws RemoteException, ServiceException {
		return controller.getAllSucursales();
	}

	public void altaEnvioInterSucursal(EnvioDTO envio) throws Exception {
		controller.altaEnvioInterSucursal(envio);
	}

	public EnvioDTO getEnvioInterSucursal(int envioId) throws RemoteException, ServiceException{
		return controller.getEnvioInterSucursal(envioId);
	}
	
	public List<EnvioDTO> getEnviosInterSucursal() throws RemoteException, ServiceException {
		return controller.getEnviosInterSucursal();
	}
	
	public CuentaCorriente getCuentaCorriente(int cuentaCorrienteId) throws RemoteException, ServiceException {
		return controller.getCuentaCorriente(cuentaCorrienteId);
	}
	
	public List<ItemCuentaCorriente> getItemsCuentaCorriente(int cuentaCorrienteId) throws RemoteException, ServiceException {
		return controller.getItemsCuentaCorriente(cuentaCorrienteId);
	}

	public void altaVehiculo(VehiculoDTO vehiculoDTO) throws RemoteException, ServiceException {
		controller.altaVehiculo(vehiculoDTO);
	}
	
	public void altaSucursal(SucursalDTO sucursalDTO) throws RemoteException, ServiceException {
		controller.altaSucursal(sucursalDTO);
	}
	
	public void altaRuta(RutaDTO rutaDTO) throws RemoteException, ServiceException {
		controller.altaRuta(rutaDTO);
	}

	public List<Vehiculo> getAllVehiculos() throws RemoteException, ServiceException {
		return controller.getAllVehiculos();
	}

	public Vehiculo buscarVehiculo(String dominio) throws RemoteException, ServiceException {
		return controller.buscarVehiculo(dominio);
	}

	public Sucursal getSucursal(String id) throws RemoteException, ServiceException {
		return controller.getSucursal(id);
	}
	
	public void altaItemMantenimientoVehiculo(String dominio, ItemPlanMantenimientoDTO itemDTO) throws RemoteException, ServiceException {
		controller.altaItemMantenimientoVehiculo(dominio, itemDTO);
	}
	
	public void altaItemCreditoCC(String cuit, String descripcion, Float importeMovimiento) throws RemoteException, ServiceException {
		controller.altaItemCreditoCC(cuit, descripcion, importeMovimiento);
	}
	public List<Viaje> getAllViajes()  throws RemoteException, ServiceException {
		return controller.getAllViajes();
	}

	public Viaje getViaje(int viajeId) throws RemoteException, ServiceException {
		return controller.getViaje(viajeId);
	}

	public void recibirViaje(int viajeId) throws RemoteException, ServiceException {
		controller.recibirViaje(viajeId);
	}

	public void entregarEnvio(int envioId) throws RemoteException, ServiceException {
		controller.entregarEnvio(envioId);
	}
	
	public void moverVehiculoASucursal(String dominio, String nombreSucursal) throws RemoteException, ServiceException {
		controller.moverVehiculoASucursal(dominio, nombreSucursal);
	}
}
